﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using SistemaCenterQuimPost.Plantillas;

using System.IO;    //3 referencias que son necesarias para el proceso de archivos.
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

using SistemaCenterQuimPost.Entidad; //necesario para crear instancias de RegistroProveedores en el proceso de archivos.


namespace SistemaCenterQuimPost.UI.PostCajero
{
    public partial class frmGenerarListaPrecio : SistemaCenterQuimPost.Plantillas.frmPlantillaHijo
    {
        //----------ATRIBUTOS------------------------------

        private DataSet2 centerQuimDs;     //variables que me permitirán conectarme con la base de datos.
        protected DataSet2TableAdapters.ProductosTableAdapter productosTa;

        //objeto para serializar los RegistroUsuario y RegistroListaPrecio en formato binario
        private BinaryFormatter aplicadorFormato = new BinaryFormatter(); //Clase que permite serializar objeto, es decir pasarlo a binario.
        private FileStream estadoPreciosSalida; //clase que maneja la información sobre el archivo y la forma de abrirlo.
         
        //---------CONSTRUCTORES---------------------------
        
        public frmGenerarListaPrecio()
        {
            InitializeComponent();

            centerQuimDs = new DataSet2();
            productosTa = new DataSet2TableAdapters.ProductosTableAdapter();

        }

        //------------------ESTADOS------------------------
        private void frmGenerarListaPrecio_Load(object sender, EventArgs e)
        {
            lblError.Visible = false; //Como es un formulario sin estado, este atributo se setea acá
        }

        //-----------------METODOS VARIOS-------------------

        private void btnProcesar_Click(object sender, EventArgs e) //capturador de evento click sobre el botón crear Archivo.
        {
            DialogResult result = MessageBox.Show("¿Está seguro que desea generar el estado de precios, para ser enviada a Casa Central?.", "ESTADO DE PRECIOS", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (result == DialogResult.Yes)
            {
                CrearArchivo(); //crea el archivo en el disco y carga los datos.
            }
            
        }

        private void CrearArchivo() //metodo que permite crear el archivoEstadoPrecio del post.
        {
            string nombreArchivo; //nombre del archivo para guardar los datos

            nombreArchivo = "C:\\Dropbox\\Datos del Sistema\\Estado de Precios\\EstadoPrecios.cq";
                        
            //guardar el archivo a través del objeto FileStream.
            try
            {
                estadoPreciosSalida = new FileStream(nombreArchivo, FileMode.OpenOrCreate, FileAccess.Write); //abre el archivo con acceso de escritura

                CargarDatosAlArchivo();

                MessageBox.Show("Estado de precios generado con exito!!", "ESTADO DE PRECIOS", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }

            catch (SerializationException)
            {
                //notifica al usuario si el archivo no existe
                MessageBox.Show("Error al escribir en el archivo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            catch (FormatException)
            {
                //notifica al usuario si el archivo no existe
                MessageBox.Show("Formato inválido", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            catch (IOException)
            {
                //notifica al usuario si el archivo no existe
                MessageBox.Show("Error al abrir el archivo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                cerrarArchivo();
            }

        }

        private void CargarDatosAlArchivo()
        {
            //-----------ESCRIBE EL ENCABEZADO---------------

           RegistroUsuario unRegistroUsuario; //instanciamos un registroUsuario(Serializado).

            unRegistroUsuario = new RegistroUsuario(obtenerUsuarioActual(),obtenerFechaActual());

            //escribe registro al objeto FileStream (serializa el objeto)
            aplicadorFormato.Serialize(estadoPreciosSalida, unRegistroUsuario);

            //-----------ESCRIBE EL CUERPO--------------------

            productosTa.FillByVigente(centerQuimDs.Productos); //actualizamos la tabla Productos.

            for (int i = 0; i < centerQuimDs.Productos.Rows.Count; i++)   //por cada registro de la tabla productos
            {
                RegistroProductoListaPrecio unRegistroListaPrecio; //instanciamos un registroListaPrecio(Serializado) y le asignamos nombre.

                unRegistroListaPrecio = new RegistroProductoListaPrecio(centerQuimDs.Productos[i].codProducto, centerQuimDs.Productos[i].descripcion, centerQuimDs.Productos[i].precioCosto, centerQuimDs.Productos[i].precioVenta, centerQuimDs.Productos[i].fechaActualización.ToString("d"));

                //escribe registro al objeto FileStream (serializa el objeto)
                aplicadorFormato.Serialize(estadoPreciosSalida, unRegistroListaPrecio);

            }
            
        }

        private void cerrarArchivo()
        {
            try
            {
                if (estadoPreciosSalida != null)  //determina si existe el archivo
                {
                    estadoPreciosSalida.Close();  //cierra el archivo
                }
            }
            catch (IOException)  //notifica al usuario del error al cerrar el archivo
            {
                MessageBox.Show("No se puede cerrar el archivo.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

        }

        private string obtenerFechaActual()  //Dato necesario para el alta de ListaPrecios
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getFechaActual();
        }

        private string obtenerUsuarioActual()  //Dato necesario para el alta de ListaPrecios
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getNombreUsuario();
        }

        

    }
}
